#ifndef PATH_H
#define PATH_H

#include "map.h"
#include <QList>

class Path : public QList<int>
{
public:
    Path();
    Path(const QList<int>& list);
    static Map* map;

    static void setMap(Map* m){map=m;}

    static Path generate(); // 生成一条随机路径
    void evaluate();   // 计算总代价及适应度
    static float fitnessFunction(float cost); // 适应度函数
    static void crossover(Path &p1,Path &p2,int index,float prob);// 以概率prob在指定位置index交叉
    void mutate(float prob);    // 以概率prob变异

    float cost; // 路径总代价
    float fitness; // 适应度


    // 按适应度大小重载大于、小于号
    friend bool operator>(const Path& p1,const Path& p2);
    friend bool operator<(const Path& p1,const Path& p2);
};
bool operator>(const Path& p1,const Path& p2);
bool operator<(const Path& p1,const Path& p2);

class Population:public QList<Path>
{
public:
    Population();
    Population(const QList<Path>& list);

    static float cProb; // 交叉概率
    static float mProb; // 变异概率
    static float rRate; // 父代保留比例

    static Population generate(int n);  // 生成一个随机种群

    void sort();    // 按适应度从大到小排序
    Population selectBest(float rate);    // 按百分比选择适应度最高的个体
    Population select(int num);    // 按适应度概率轮盘赌选择个体
    void crossover(float prob); // 交叉算子

    Population propagate();

    friend QDebug operator<<(QDebug debug,const Population &pop);
};
QDebug operator<<(QDebug debug,const Population &pop);

#endif // PATH_H
